#include "bsp_hp_rtc_alarm.h"

void alarm_irq(unsigned int giccIar, void *param) {

  if ((SNVS->HPSR & 0x1) == 1) {
    led_switch(LED0, 1);
    beep_switch(ON);
    delay_s(2);
    led_switch(LED0, 0);
    beep_switch(OFF);
    SNVS->HPSR |= (0x1);
    while ((SNVS->HPSR & 0x1)) {
    }
  }
}

/**
 * @brief RTC_HP_Alarm 初始化
 *
 */
void RTC_HP_Alarm_Init(void) { RTC_HP_Alarm_Disable(); }

/**
 * @brief 设置时间和日期
 *
 * @param datetime 要设置的日期和时间
 */
void RTC_HP_Alarm_Setdatetime(rtc_datetime *datetime) {

  u64 seconds = 0;
  unsigned int tmp = SNVS->HPCR;

  RTC_HP_Alarm_Disable(); /* 设置寄存器HPRTCMR和HPRTCLR的时候一定要先关闭RTC */

  /* 先将时间转换为秒         */
  seconds = rtc_coverdate_to_seconds(datetime);

  SNVS->HPTAMR = (unsigned int)(seconds >> 17); /* 设置高15位 */
  SNVS->HPTALR = (unsigned int)(seconds << 15); /* 设置低17位 */

  /* 如果此前RTC是打开的在设置完RTC时间以后需要重新打开RTC */
  if (tmp & 0x2)
    RTC_HP_Alarm_Enable();
}

/**
 * @brief 开启RTC_Alarm
 *
 */
void RTC_HP_Alarm_Enable(void) {
  /*
   * LPCR寄存器bit0置1，使能RTC
   */
  SNVS->HPCR |= 1 << 1;
  while (!(SNVS->HPCR & 0X02))
    ; // 等待使能完成
}

/**
 * @brief 关闭RTC_Alarm
 *
 */
void RTC_HP_Alarm_Disable(void) {
  /*
   * LPCR寄存器bit0置0，关闭RTC
   */
  SNVS->HPCR &= ~(1 << 1);
  while (SNVS->HPCR & 0X02)
    ; // 等待关闭完成
}
